package com.bbva.kyfb.kyfbbofi;

import java.util.List;

import com.bbva.jee.arq.spring.core.gce.ExcepcionEjecucionAplicacion;
import com.bbva.jee.arq.spring.core.util.excepciones.PropiedadNoEncontradaExcepcion;
import com.bbva.kyfb.kyfbdto.firmas.bo.Auditoria;
import com.bbva.kyfb.kyfbdto.firmas.bo.ComponenteFirmable;
import com.bbva.kyfb.kyfbdto.firmas.bo.ConsultaEmpresaAsociadasNifDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.ConsultaEmpresaAsociadasRefDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.DatosPAU;
import com.bbva.kyfb.kyfbdto.firmas.bo.DeletedFilesDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.EmpresaNifOutDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.EmpresaRefOutDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.FicheroInfo;
import com.bbva.kyfb.kyfbdto.firmas.bo.FicheroPdteFirma;
import com.bbva.kyfb.kyfbdto.firmas.bo.FirmaComponente;
import com.bbva.kyfb.kyfbdto.firmas.bo.FirmanteInfo;
import com.bbva.kyfb.kyfbdto.firmas.bo.InfoComponentDetailDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.InfoComponentInDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.ListNData;
import com.bbva.kyfb.kyfbdto.firmas.bo.Listado;
import com.bbva.kyfb.kyfbdto.firmas.bo.NotificacionOutDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.OrdenMifidInDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.OrdenMifidOutDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.UpdateInfoInDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.UpdateInfoOutDto;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.SignedComponentsResponse;
import com.bbva.kyfb.kyfbdto.firmas.filtros.FilesDeleteInfo;

/**
 * The Interface IFirmasBo.
 */
public interface IFirmasBo
{

	/**
	 * Gets the componentes pendientes referencia.
	 *
	 * @param file the file
	 * @return the componentes pendientes referencia
	 * @throws ExcepcionEjecucionAplicacion the excepcion ejecucion aplicacion
	 */
	List<FicheroPdteFirma> getComponentesPendientesReferencia(final FicheroInfo file) throws ExcepcionEjecucionAplicacion;


	/**
	 * Gets the componentes pendientes referencia usuario.
	 *
	 * @param file the file
	 * @return the componentes pendientes referencia usuario
	 * @throws ExcepcionEjecucionAplicacion the excepcion ejecucion aplicacion
	 */
	List<FicheroPdteFirma> getComponentesPendientesReferenciaUsuario(FicheroInfo file) throws ExcepcionEjecucionAplicacion;

	/**
	 * Gets the total componentes pendientes referencia.
	 *
	 * @param file the file
	 * @return the total componentes pendientes referencia
	 * @throws ExcepcionEjecucionAplicacion the excepcion ejecucion aplicacion
	 */
	int getTotalComponentesPdtesReferencia(FicheroInfo file, String[] timeStamps) throws ExcepcionEjecucionAplicacion;

	/**
	 * Delete componente pendientes.
	 *
	 * @param file the file
	 * @param usuario the usuario
	 * @param tipoFirma the tipo firma
	 * @param nif the nif
	 * @return the list
	 * @throws ExcepcionEjecucionAplicacion the excepcion ejecucion aplicacion
	 */
	List<DeletedFilesDto> deleteComponentePendientes(List<FilesDeleteInfo> file, DatosPAU usuario, String tipoFirma, String nif, String codigoAplicacion) throws ExcepcionEjecucionAplicacion ;

	/**
	 * Gets the auditoria componente pendientes.
	 *
	 * @param file the file
	 * @return the auditoria componente pendientes
	 * @throws ExcepcionEjecucionAplicacion the excepcion ejecucion aplicacion
	 */
	List<Auditoria> getAuditoriaComponentePendientes(FicheroInfo file) throws ExcepcionEjecucionAplicacion;


	/**
	 * Gets the componente tipo mifid.
	 *
	 * @param ordenMifidInDto the orden mifid in dto
	 * @return the componente tipo mifid
	 * @throws ExcepcionEjecucionAplicacion the excepcion ejecucion aplicacion
	 * @throws NumberFormatException the number format exception
	 * @throws PropiedadNoEncontradaExcepcion the propiedad no encontrada excepcion
	 */
	OrdenMifidOutDto getComponenteTipoMifid(OrdenMifidInDto ordenMifidInDto) throws ExcepcionEjecucionAplicacion, NumberFormatException, PropiedadNoEncontradaExcepcion;

	/**
	 * Gets the usuarios firma realizada.
	 *
	 * @param file the file
	 * @return the usuarios firma realizada
	 * @throws ExcepcionEjecucionAplicacion the excepcion ejecucion aplicacion
	 */
	List<FirmanteInfo> getUsuariosFirmaRealizada(FicheroInfo file)  throws ExcepcionEjecucionAplicacion ;

	/**
	 * Gets the consulta empresas asociadas por nif.
	 *
	 * @param consultaEmpresaAsociadasNifDto the consulta empresa asociadas nif dto
	 * @return the consulta empresas asociadas por nif
	 * @throws ExcepcionEjecucionAplicacion the excepcion ejecucion aplicacion
	 */
	EmpresaNifOutDto getConsultaEmpresasAsociadasPorNif (ConsultaEmpresaAsociadasNifDto consultaEmpresaAsociadasNifDto) throws ExcepcionEjecucionAplicacion;

	/**
	 * Devuelve el fichero pendiente de firma por fichero info.
	 * @param FicheroInfo file
	 * @return FicheroPdteFirma
	 */
	FicheroPdteFirma getFicheroPdteFirma(final FicheroInfo file);

	/**
	 * Gets the usuarios firma pedte.
	 *
	 * @param file the file
	 * @param ficheroPdte the ficheroPdte
	 * @throws ExcepcionEjecucionAplicacion the excepcion ejecucion aplicacion
	 */
	List<FirmanteInfo> getUsuariosFirmaPedte (FicheroInfo file, FicheroPdteFirma ficheroPdte) throws ExcepcionEjecucionAplicacion;

	/**
	 * Gets the componentes firmables.
	 *
	 * @param file the file
	 * @param refAsociadas the ref asociadas
	 * @return the componentes firmables
	 * @throws ExcepcionEjecucionAplicacion the excepcion ejecucion aplicacion
	 */
	List<ComponenteFirmable> getComponentesFirmables(FicheroInfo file,boolean refAsociadas)throws ExcepcionEjecucionAplicacion ;

	/**
	 * Gets the componentes firmables sin referencia.
	 *
	 * @param file the file
	 * @return the componentes firmables
	 * @throws ExcepcionEjecucionAplicacion the excepcion ejecucion aplicacion
	 */
	List<ComponenteFirmable> getComponentesFirmables(FicheroInfo file) throws ExcepcionEjecucionAplicacion;

	/**
	 * Gets the consulta empresas asociadas por referencia.
	 *
	 * @param consultaEmpresaAsociadasRefDto the consulta empresa asociadas ref dto
	 * @return the consulta empresas asociadas por referencia
	 * @throws ExcepcionEjecucionAplicacion the excepcion ejecucion aplicacion
	 */
	EmpresaRefOutDto getConsultaEmpresasAsociadasPorReferencia (ConsultaEmpresaAsociadasRefDto consultaEmpresaAsociadasRefDto) throws ExcepcionEjecucionAplicacion;

	/**
	 * Put firma componente.
	 *
	 * @param firmaComponente the firma componente
	 * @return the signed components response
	 * @throws ExcepcionEjecucionAplicacion the excepcion ejecucion aplicacion
	 */
	SignedComponentsResponse putFirmaComponente(FirmaComponente firmaComponente) throws ExcepcionEjecucionAplicacion ;

	/**
	 * Put firma componente host.
	 *
	 * @param firmaComponente the firma componente
	 * @return the signed components response
	 * @throws ExcepcionEjecucionAplicacion the excepcion ejecucion aplicacion
	 * @throws PropiedadNoEncontradaExcepcion the propiedad no encontrada excepcion
	 */
	SignedComponentsResponse putFirmaComponenteHost(FirmaComponente firmaComponente) throws ExcepcionEjecucionAplicacion, PropiedadNoEncontradaExcepcion ;

	/**
	 * Gets the usuarios firma pedte host.
	 *
	 * @param file the file
	 * @return the usuarios firma pedte host
	 * @throws ExcepcionEjecucionAplicacion the excepcion ejecucion aplicacion
	 */
	List<FirmanteInfo> getUsuariosFirmaPedteHost (FicheroInfo file, FicheroPdteFirma ficheroPdte) throws ExcepcionEjecucionAplicacion;

	/**
	 * Gets the componentes pendientes referencia host.
	 *
	 * @param file the file
	 * @return the componentes pendientes referencia host
	 * @throws ExcepcionEjecucionAplicacion the excepcion ejecucion aplicacion
	 */
	ListNData<FicheroPdteFirma,String[]> getComponentesPendientesReferenciaHost(FicheroInfo file) throws ExcepcionEjecucionAplicacion;

	/**
	 * Gets the componentes pendientes referencia usuario host.
	 *
	 * @param file the file
	 * @return the componentes pendientes referencia usuario host
	 * @throws ExcepcionEjecucionAplicacion the excepcion ejecucion aplicacion
	 */
	Listado<FicheroPdteFirma> getComponentesPendientesReferenciaUsuarioHost(FicheroInfo file) throws ExcepcionEjecucionAplicacion;

	/**
	 * Envia notificacion.
	 *
	 * @param datosPAU the datos pau
	 * @return the string
	 * @throws ExcepcionEjecucionAplicacion the excepcion ejecucion aplicacion
	 * @throws PropiedadNoEncontradaExcepcion the propiedad no encontrada excepcion
	 */
	NotificacionOutDto sendNotificacion(DatosPAU datosPAU) throws ExcepcionEjecucionAplicacion, PropiedadNoEncontradaExcepcion;

	/**
	 * Obtiene un detalle de componente.
	 *
	 * @param info the info Detalle Componente
	 * @return the InfoComponentDetailOutDto
	 * @throws ExcepcionEjecucionAplicacion the excepcion ejecucion aplicacion
	 */
	InfoComponentDetailDto getDetalleComponente(InfoComponentInDto info) throws ExcepcionEjecucionAplicacion;

	/**
	 * Realiza la actualizacion del numero aleatorio para un usuario y una lista de idOrden
	 * @param info el UpdateInfoInDto
	 * @return el UpdateInfoOutDto
	 * @throws ExcepcionEjecucionAplicacion
	 */
	UpdateInfoOutDto updateNumeroAleatorioComponentesUsuario(UpdateInfoInDto info) throws ExcepcionEjecucionAplicacion;

	/**
	 * Asigna a cada firmante si es obligatorio o no el mensaje de confirmación y devuelve el código para dicho mensaje.
	 * @param lstFchPteFirma
	 * @param posiblesFirmantes
	 */
	String mergeMsgAcepTipoOrden(String codAplicacion, String codTipoOrden, List<FirmanteInfo> listaFirmantes);

	/**
	 * Asigna a cada firmante si es obligatorio o no el mensaje de confirmación y devuelve el código para dicho mensaje.
	 * @param lstFchPteFirma
	 * @param posiblesFirmantes
	 */
	void mergeMsgAcepCodUsuario(String codAplicacion, String codUsuario, List<FicheroPdteFirma> lstFichPteFirma);

}
